#include "Bsp_UART_3_ESP12F.h"
#include "Delay.h"
#include <stdio.h>
#include <string.h>

#include "Bsp_GPIO_Led.h"
#include "Bsp_GPIO_Beep.h"
#include "Bsp_GPIO_FAN.h"
#include "Bsp_GPIO_Moto.h"

/***************************************************************
 * Bsp_UART_3_ESP12F.c
 * ESP8266 WiFi 模块串口通信模块实现（PB10/PB11）
 * TX → PB10
 * RX → PB11
 ***************************************************************/

// 连接信息（根据你的路由器和服务器设置）
#define WIFI_SSID "LAPTOP-0FDLBM20 9374"
#define WIFI_PASS "12345678"
#define SERVER_IP "192.168.137.1"
#define SERVER_PORT 8080

// 定义发送和接收缓冲区

#define Send_BUF_MAX 1024

#define Recv_BUF_MAX 1024

char USART_3_Send_cmd[Send_BUF_MAX] = {0};
char USART_3_Recv_cmd[Recv_BUF_MAX] = {0};

uint16_t USART_3_Send_Index = 0;
uint16_t USART_3_Recv_Index = 0;

char USART_3_Recv_ch = 0;

// 收发标志
volatile uint8_t ESP_Recv_Flag = 0;

void USART_3_ESP12F_Init(uint32_t baudrate)
{
    // 1. 开启 GPIOA 和 USART3 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    // 2. 配置 GPIOA9 (TX), GPIOA10 (RX)
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 3. 配置复用功能（AF7）
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); // TX
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); // RX

    // 4. 配置串口参数
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_BaudRate = baudrate;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART3, &USART_InitStruct);

    // 5. 启动串口
    USART_Cmd(USART3, ENABLE);
}

void USART_3_ESP12F_NVIC_Init(void)
{
    // 开启接收中断
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

    // NVIC 配置
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

// 发送命令函数
static void USART_3_ESP12F_Send_Cmd(void)
{
    // 发送字符串
    for (uint16_t i = 0; i < strlen(USART_3_Send_cmd); i++)
    {
        USART_SendData(USART3, USART_3_Send_cmd[i]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
        {
        }
    }

    memset(USART_3_Send_cmd, 0, sizeof(USART_3_Send_cmd));
}

// WiFi 模块初始化函数（包含 WiFi + TCP 建连 + 发数据）
void USART_3_ESP12F_TCP_Init(void)
{
    // 清空发送接收缓冲区
    memset(USART_3_Send_cmd, 0, sizeof(USART_3_Send_cmd));
    memset(USART_3_Recv_cmd, 0, sizeof(USART_3_Recv_cmd));

    // 初始化 USART 3
    USART_3_ESP12F_Init(115200);

    // 初始化 USART 3 中断
    USART_3_ESP12F_NVIC_Init();

    // 等待设备启动
    Delay_ms(2000); // 等待模块响应

    // 1.发送 AT 指令，检查模块是否响应
    strcpy(USART_3_Send_cmd, "AT\r\n");
    USART_3_ESP12F_Send_Cmd();

    Delay_ms(200); // 等待模块响应

    // 2.发送  配置 WiFi 模式   3 TCP
    strcpy(USART_3_Send_cmd, "AT+CWMODE=3\r\n");
    USART_3_ESP12F_Send_Cmd();

    Delay_ms(1000); // 等待模块响应

    // 连接路由器
    sprintf(USART_3_Send_cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_SSID, WIFI_PASS);
    USART_3_ESP12F_Send_Cmd();

    Delay_ms(5000); // 等待连接成功

    // 连接TCP服务器
    sprintf(USART_3_Send_cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", SERVER_IP, SERVER_PORT);
    USART_3_ESP12F_Send_Cmd();
}

void USART3_IRQHandler(void)
{
    //
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
    {

        // 清除标志位
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);

        // 接收字符
        USART_3_Recv_ch = USART_ReceiveData(USART3);

        USART_3_Recv_cmd[USART_3_Recv_Index] = USART_3_Recv_ch;
        USART_3_Recv_cmd[USART_3_Recv_Index + 1] = '\0';

        if (USART_3_Recv_Index >= Recv_BUF_MAX)
        {
            printf("接收数据越界\r\n");
        }

        // 前面出现 \r\n 需要去掉
        if(USART_3_Recv_Index == 0 && (USART_3_Recv_ch == '\n' || USART_3_Recv_ch == '\r'))
        {
            USART_3_Recv_Index = 0;

            return;
        }



        if (USART_3_Recv_ch == '\n')
        {
            //
            USART_3_ParseCommand(USART_3_Recv_cmd); // 调用命令执行函数
            
            ESP_Recv_Flag = 1;

            USART_3_Recv_Index = 0;

            return;
        }

        USART_3_Recv_Index++;
    }
}

// 接收消息函数  主函数调用
void USART_3_ESP12F_TCP_Recv_INFO(char *buf, uint16_t size)
{
    int len = 0;
    if (ESP_Recv_Flag)
    {
        ESP_Recv_Flag = 0;

        if (NULL != buf)
        {
            // 数据处理
            sscanf(USART_3_Recv_cmd, "+IPD,%d:%s", &len, buf);

            // 保存信息   是 strcpy 安全函数
            strncpy(buf, USART_3_Recv_cmd, size);
            printf("%s\n", buf);
        }

        memset(USART_3_Recv_cmd, 0, sizeof(USART_3_Recv_cmd));
    }
}

// 发送消息函数 主函数调用
void USART_3_ESP12F_TCP_Send_INFO(char *buf, uint16_t len)
{
    if (NULL != buf)
    {
        // 1. 准备发送数据  AT+CIPSEND=17
        sprintf(USART_3_Send_cmd, "AT+CIPSEND=%d\r\n", strlen(buf));
        USART_3_ESP12F_Send_Cmd();
        Delay_ms(100);

        // 2. 发送数据
        strcpy(USART_3_Send_cmd, buf);
        USART_3_ESP12F_Send_Cmd();
    }
}

/*
指令列表说明：
    TCP_CMD_LED         总控灯光
    TCP_CMD_LED_D2      控制 D2 灯
    TCP_CMD_LED_1       控制 LED1
    TCP_CMD_LED_2       控制 LED2
    TCP_CMD_LED_3       控制 LED3
    TCP_CMD_Beep        控制蜂鸣器
    TCP_CMD_Moto        控制振动马达
    TCP_CMD_FAN         控制风扇

*/

// 指令解析函数
static void USART_3_ParseCommand(const char *cmd)
{
    printf("%s" , cmd);
    // 数据处理
    char temp_str[1024] = {0};
    uint32_t temp_len = 0;
    
    // 处理指令
    // 数据处理
    sscanf(cmd, "+IPD,%d:%s", &temp_len, temp_str);

    if (strstr(temp_str, "TCP_CMD_LED"))
    {
        LED_D2_Toggle();
        LED_ToggleBits(1);
        LED_ToggleBits(2);
        LED_ToggleBits(3);
    }
    else if (strstr(temp_str, "TCP_CMD_LED_D2"))
    {
        LED_D2_Toggle();
    }
    else if (strstr(temp_str, "TCP_CMD_LED_1"))
    {
        LED_ToggleBits(1);
    }
    else if (strstr(temp_str, "TCP_CMD_LED_2"))
    {
        LED_ToggleBits(2);
    }
    else if (strstr(temp_str, "TCP_CMD_LED_3"))
    {
        LED_ToggleBits(3);
    }
    else if (strstr(temp_str, "TCP_CMD_Beep"))
    {
        Beep_Aler();
    }
    else if (strstr(temp_str, "TCP_CMD_Moto"))
    {
        Moto_Aler();
    }
    else if (strstr(temp_str, "TCP_CMD_FAN"))
    {
        FAN_Aler();
    }
    else
    {
        printf("收到未知指令：%s\r\n", temp_str);
    }
}




